#ifndef SISTEMA_H
#define SISTEMA_H

#include "ISistema.h"
#include "AvlImp.h"
#include "Tabla.h"
#include "TablaHash.h"
#include "Ciudad.h"
#include "Cliente.h"
#include "Excursion.h"
#include "ColaPrioridadHeaps.h"

class Sistema : public ISistema
{
public:
	Sistema(nat VEOLCIDAD_OMNIBUS, nat VELOCIDAD_AVION, nat COSTO_OMNIBUS, nat COSTO_AVION, nat CAPACIDAD_OMNIBUS, nat CAPACIDAD_AVION, nat MAX_CIUDADES, nat MAX_EXCURSIONES, nat MAX_CLIENTES);
	virtual ~Sistema();

	// Tipo 1
	TipoRetorno IngresoCiudad(Cadena nombre, nat costoDiario);
	TipoRetorno IngExcItinerario(nat nroExcursion, Cadena fechaPartida, Puntero<Iterador<Tupla<Cadena, nat>>> ciudades);
	TipoRetorno IngresoCliente(Cadena ci, Cadena nombre, Cadena fechaRegistro);
	TipoRetorno CompraExcursion(Cadena ciCliente, nat nroExcursion);
	Tupla<TipoRetorno, Puntero<Iterador<pCiudad>>> ListCiudades();
	Tupla<TipoRetorno, Puntero<Iterador<pCliente>>> ListClientes();
	Tupla<TipoRetorno, Puntero<Iterador<pExcursion>>> ListExcursiones();

	// Tipo 2
	TipoRetorno BajaCliente(Cadena ci);
	Tupla<TipoRetorno, Puntero<Iterador<Tupla<pCiudad, nat>>>, nat> ConsExcursion(nat nroExcursion);
	Tupla<TipoRetorno, pCliente, Puntero<Iterador<pExcursion>>> ConsCliente(Cadena ci);
	Tupla<TipoRetorno, pCiudad, Puntero<Iterador<pExcursion>>> ConsCiudad(Cadena nombreCiudad);
	Tupla<TipoRetorno, pCliente> MejorCliente();

private:
	Puntero<Avl< Puntero<Ciudad> >> ciudadesAvl;
	Puntero<Tabla<Cadena, Puntero<Ciudad> > > ciudadesHash;
	Puntero<Avl<Puntero<Cliente>> > clientesAvl;
	Puntero<Tabla<Cadena, Puntero<Cliente> > > clientesHash;
	Puntero<ColaPrioridad<Puntero<Cliente>,nat>> clientesHeap;
	Puntero<Avl< Puntero<Excursion> >> excursionesAvl;
	Puntero<Tabla<nat, Puntero<Excursion> > > excursionesHash;
	nat V_MAX_CIUDADES;
	nat V_MAX_EXCURSIONES;
	nat V_MAXCLIENTES;
	nat V_VEOLCIDAD_OMNIBUS;
	nat V_VELOCIDAD_AVION;
	nat V_COSTO_OMNIBUS;
	nat V_COSTO_AVION;
	nat V_CAPACIDAD_OMNIBUS;
	nat V_CAPACIDAD_AVION;
};

#endif
